﻿using NPOI.OpenXmlFormats.Dml;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MgSoft.Excel.Model.Template
{
    public class TemplateConfig
    {
        //读取第几个序时簿，默认第0个
        public int SheetIndex { get; set; } = 0;
        // 错误标识列（错误标识列和错误信息列必须同时设置才会写入信息）
        public string ErrorFlagColumnName { get; set; }
        // 错误信息列（错误标识列和错误信息列必须同时设置才会写入信息）
        public string ErrorMessageColumnName { get; set; }
        /// <summary>
        /// 模板匹配规则类型
        /// </summary>
        public TemplateMatchingType TemplateConfigMatchingType { get; set; } = TemplateMatchingType.Ignore;

        public TemplateConfig()
        {
            TemplateCellConfigs = new List<TemplateCellConfig>();
        }

        /// <summary>
        /// 模板单元格配制
        /// </summary>
        public List<TemplateCellConfig> TemplateCellConfigs { get; private set; }

        /// <summary>
        /// 获取关键数据，该数据定义了表格的数据行数
        /// </summary>
        /// <returns></returns>
        public TemplateCellConfig GetKeyCellConfig()
        {
            var templateCellConfigs = TemplateCellConfigs.Where(p => p.IsKey == true).ToList();
            if (templateCellConfigs.Count == 0)
            {
                throw new MgExcelException("模板没有设置关键数据");
            }
            if (templateCellConfigs.Count > 2)
            {
                throw new MgExcelException($"模板设置了多个关键数据:{BuildNames(templateCellConfigs, ",")}");
            }
            return templateCellConfigs[0];
        }

        public string BuildNames(List<TemplateCellConfig> templateCellConfigs, string split)
        {
            StringBuilder result = new StringBuilder();
            templateCellConfigs.ForEach(p => result.Append(p.Name + split));
            if (result.Length > 0) result = result.Remove(result.Length - 1, 1);
            return result.ToString();
        }

        /// <summary>
        /// 设置已有模板
        /// </summary>
        /// <param name="templateCellConfigs"></param>
        public void SetTemplateCellConfigs(List<TemplateCellConfig> templateCellConfigs)
        {
            check(TemplateCellConfigs);
            TemplateCellConfigs = templateCellConfigs;
        }

        /// <summary>
        /// 增加一个单元格模板
        /// </summary>
        /// <param name="templateCellConfig"></param>
        public void AddTemplateCellConfig(TemplateCellConfig templateCellConfig)
        {
            checkNameDuplicate(templateCellConfig);
            checkKeyDuplicate(templateCellConfig);
            checkColumnNameDuplicate(templateCellConfig);
            TemplateCellConfigs.Add(templateCellConfig);
        }

        private void checkColumnNameDuplicate(TemplateCellConfig templateCellConfig)
        {
            if (TemplateCellConfigs.Any(p => p.ColumnName == templateCellConfig.ColumnName && p.Ext == templateCellConfig.Ext))
            {
                throw new MgExcelException($"数据模板{templateCellConfig.ColumnName}列重复");
            }
        }

        private void checkKeyDuplicate(TemplateCellConfig templateCellConfig)
        {
            if (!templateCellConfig.IsKey) return;

            if (TemplateCellConfigs.Any(p => p.IsKey))
            {
                throw new MgExcelException($"已经设置关键数据列{TemplateCellConfigs.Where(p => p.IsKey).Single().Name}");
            }
        }

        /// <summary>
        /// 检查名称是否重复
        /// </summary>
        /// <param name="templateCellConfig"></param>
        private void checkNameDuplicate(TemplateCellConfig templateCellConfig)
        {
            if (TemplateCellConfigs.Any(p => p.Name == templateCellConfig.Name))
            {
                throw new MgExcelException($"数据模板{templateCellConfig.Name}字段名重复");
            }
        }

        /// <summary>
        /// 校验模板
        /// </summary>
        /// <param name="templateCellConfigs"></param>
        private void check(List<TemplateCellConfig> templateCellConfigs)
        {
            checkNameDuplicate(templateCellConfigs);
        }


        private void checkNameDuplicate(List<TemplateCellConfig> templateCellConfigs)
        {
            var groupNames = templateCellConfigs.GroupBy(p => p.Name).Where(p => p.Count() > 1).Select(p => p.Key).ToString();
            if (groupNames.Count() > 0)
            {
                throw new MgExcelException($"{groupNames[0]}字段名重复");
            }
        }
    }
}
